# -*- coding: utf-8 -*-
"""
Created on Fri Sep 24 09:15:19 2021

@author: Administrator
"""
#HSI颜色空间中的分割
from skimage import data
from matplotlib import pyplot as plt
import numpy as np
import math
import sys
#定义RGB转HSI
def rgb2hsi(r,g,b):
    r=r/255
    g=g/255
    b=b/255
    num=0.5*(r-g)+(r-b)
    den=((r-g)*(r-g)+(r-b)*(g-b))**0.5 
    if b<=g:
        if den==0:
            den=sys.float_info.min
            h=math.acos(num/den)
        elif b>g:
            if den==0:
                den=sys.float_info.min
                h=(2*math.pi)-math.acos(num/den)
                s=1-(3*min(r,g,b)/(r+g+b))
                i=(r+g+b)/3
                return int(h),int(s*100),int(i*255)
            image=data.coffee()
            #data.imread('flower.jpg')
            hsi_image=np.zeros(image.shape,dtype='uint8')
            for ii in range(image.shape[0]):
                for jj in range(image.shape[1]):
                    r,g,b=image[ii,jj,:]
                    h,s,i=rgb2hsi(r,g,b)
                    hsi_image[ii,jj,:]=(h,s,i)
                    H=hsi_image[:,:,0]
                    S=hsi_image[:,:,1]
                    I=hsi_image[:,:,2]
                    #生成二值饱和度模板
                    S_template=np.zeros(S.shape,dtype='uint8')
                    for i in range(S.shape[0]):
                        for j in range(S.shape[1]):
                            if S[i,j]>0.3*S.max():
                                S_template[i,j]=1
                                #色调图像与二值饱和度模板相乘可得到分割结果F
                                F=np.zeros(H.shape,dtype='uint8')
                                for i in range(F.shape[0]):
                                    for j in range(F.shape[1]):
                                        F[i,j]=H[i,j]*S_template[i,j]
                                        #显示结果
                                        plt.figure()
                                        
                                        #不显示坐标轴
                                        plt.axis('off')
                                         #显示RGB原图像
                                        plt.imshow(image)
                                         #H分量图像
                                        plt.figure()
                                         #不显示坐标轴
                                        plt.axis('off')
                                         #显示H分量图像
                                        plt.imshow(H, camp='gray')
                                          #S分量图像
                                        plt.figure()
                                         #不显示坐标轴
                                        plt.axis('off')
                                         #显示S分量图像
                                        plt.imshow(S, camp='gray')
                                          #I分量图像
                                        plt.figure()
                                         #不显示坐标轴
                                        plt.axis('off')
                                         #显示I分量图像
                                        plt.imshow(I, camp='gray')
                                          #二值饱和度模板图像
                                        plt.figure()
                                         #不显示坐标轴
                                        plt.axis('off')
                                         #显示二值饱和度模板图像
                                        plt.imshow(S_template, camp='gray')
                                          #F分割图像
                                        plt.figure()
                                         #不显示坐标轴
                                        plt.axis('off')
                                         #显示F分割图像
                                        plt.imshow(F, camp='gray')
                                
                                
                        
                
    


                    
#RGB颜色空间中的分割                   
from skimage import data
from matplotlib import pyplot as plt
import numpy as np
import math
img=data.coffee()   
r=img[:,:,0]
g=img[:,:,1]
b=img[:,:,2] 
r1=r[128:255,85:169] 
r1_u=np.mean(r1)
r1_d=0.0
for i in range(r1.shape[0]):
    for j in range(r1.shape[1]):
        r1_d=r1_d+(r1[i,j]-r1_u)*(r1[i,j]-r1_u)
        r1_d=math.sqrt(r1_d/r1.shape[0]/r1.shape[1])
        r2=np.zeros(r.shape,dtype='uint8')
        for i in range(r.shape[0]):
            for j in range(r.shape[1]):
                if r[i,j]>=(r1_u-1.25*r1_d)and r[i,j]<=(r1_u+1.25*r1_d):
                    r2[i,j]=1
                    img2=np.zeros(img.shape,dtype='uint8')
                    for i in range(r1.shape[0]):
                       for j in range(r.shape[1]):
                           
                           if r2[i,j]==1:
                               img2[i,j,:]=img[i,j,:]
                               
                               plt.figure()#显示结果
                               #不显示坐标轴
                               plt.axis('off')
                               #显示RGB原图像
                               plt.imshow(img)
                               #R分量图像
                               plt.figure()
                               #不显示坐标轴
                               plt.axis('off')
                               #显示HR分量图像
                               plt.imshow(r, camp='gray')
                               #G分量图像
                               plt.figure()
                               #不显示坐标轴
                               plt.axis('off')
                               #显示G分量图像
                               plt.imshow(g, camp='gray')
                               #B分量图像
                               plt.figure()
                               #不显示坐标轴
                               plt.axis('off')
                               #显示B分量图像
                               plt.imshow(b, camp='gray')
                               #红色分割图像
                               plt.figure()
                               #不显示坐标轴
                               plt.axis('off')
                               #显示红色分割图像
                               plt.imshow(r2, camp='gray')
                               #分割后的RGB图像
                               plt.figure()
                               #不显示坐标轴
                               plt.axis('off')
                               #显示分割后的RGB图像
                               plt.imshow(img2)
                               
                   
                    
        
        
               
                     
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    